From: Keir Fraser Date: Thu, 17 Jan 2008 14:41:12 +0000 (+0000) Subject: minios: add wait_event_deadline X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~14445^2~28 X-Git-Url: https://dgit.raspbian.org/%22http:/www.example.com/cgi/%22https:/%22bookmarks://%22/%22http:/www.example.com/cgi/%22https:/%22bookmarks:/%22?a=commitdiff_plain;h=e2edfe6c73a287989911630a070c3e6c1137446f;p=xen.git minios: add wait_event_deadline Signed-off-by: Samuel Thibault Signed-off-by: Tim Deegan --- diff --git a/extras/mini-os/include/wait.h b/extras/mini-os/include/wait.h index 6bd4d0ce95..cbcaab3519 100644 --- a/extras/mini-os/include/wait.h +++ b/extras/mini-os/include/wait.h @@ -85,29 +85,31 @@ static inline void wake_up(struct wait_queue_head *head) local_irq_restore(flags); \ } while (0) -#define wait_event(wq, condition) do{ \ - unsigned long flags; \ - if(condition) \ - break; \ - DEFINE_WAIT(__wait); \ - for(;;) \ - { \ - /* protect the list */ \ - local_irq_save(flags); \ - add_wait_queue(&wq, &__wait); \ - block(current); \ - local_irq_restore(flags); \ - if(condition) \ - break; \ - schedule(); \ - } \ - local_irq_save(flags); \ - /* need to wake up */ \ - wake(current); \ - remove_wait_queue(&__wait); \ - local_irq_restore(flags); \ +#define wait_event_deadline(wq, condition, deadline) do { \ + unsigned long flags; \ + if(condition) \ + break; \ + DEFINE_WAIT(__wait); \ + for(;;) \ + { \ + /* protect the list */ \ + local_irq_save(flags); \ + add_wait_queue(&wq, &__wait); \ + current->wakeup_time = deadline; \ + clear_runnable(current); \ + local_irq_restore(flags); \ + if((condition) || (deadline && NOW() >= deadline)) \ + break; \ + schedule(); \ + } \ + local_irq_save(flags); \ + /* need to wake up */ \ + wake(current); \ + remove_wait_queue(&__wait); \ + local_irq_restore(flags); \ } while(0) +#define wait_event(wq, condition) wait_event_deadline(wq, condition, 0)